<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>3.姓名案例_计算属性</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
	<!-- 
		计算属性总结：
			1.定义：要用的属性（数据）不存在，要根据已有属性（数据）计算得来。

			2.关于get函数
						get函数何时调用？
								(1).初次读取fullName时。
								(2).当计算fullName所【依赖的数据】发生改变时。
						get函数中的this是vm。
			
			3.关于set函数
						set函数何时调用？仅当计算属性被修改时。
						什么是修改计算属性？
								这叫做修改计算属性：this.fullName = 'Li-si'
								这不叫修改计算属性：this.firstName = 'li'
						set函数中的this是vm。

			4.原理：底层通过Objcet.defineProperty实现的。

			5.优势：与methods实现相比，内部有缓存机制（可以复用），效率更高，且调试方便。

			6.备注：
					(1).计算属性最终也会出现在vm上，在模板中可直接使用，不要加()，不要加.get()！！
					(2).如果计算属性后期会被修改，那必须写set函数（setter）去响应修改。
	-->

		<!-- 准备好一个容器-->
		<div id="demo">
			姓：<input type="text" v-model="firstName"> <br>
			名：<input type="text" v-model="lastName"> <br>
			全名：<span>{{fullName}}</span> <br>
			<button @click="changeFullname">直接把全名改为Li-si</button>
			<!-- <h1>{{n}}</h1> -->
			<!-- <button @click="add">点我让n+1</button> -->
		</div>

		<script type="text/javascript">
			//阻止 vue 在启动时生成生产提示。
			Vue.config.productionTip = false
			
			let vm = new Vue({
				el:'#demo',
				data:{
					firstName:'zhang',
					lastName:'san',
					n:1
				},
				methods:{
					add(){
						this.n += 1
					},
					changeFullname(){
						//特别注意下面这行：这行是属于直接修改一个计算属性
						this.fullName = 'Li-si'
					}
				},
				computed:{
					fullName:{
						/* 
							get函数何时会被调用？
								(1).有人读取fullName的时。
								(2).计算fullName所【依赖的数据】，发生变化时。
							get函数的返回值有什么用？ —— 就是fullName的值。
							get函数中的this是谁？ —— vm。
						*/
						get(){
							console.log('get----')
							// console.log('初次读取 或 计算全名依赖的数据发生变化了',this)
							return this.firstName.slice(0,1).toUpperCase() + this.firstName.slice(1) + '-' + this.lastName
						},
						/* 
							set函数何时会被调用？—— 有人直接去修改fullName时。
							set函数会收到什么参数？ —— 修改后的最新值。
							set函数中的this是谁？ —— vm。
						*/
						set(value){
							console.log('set----')
							const arr = value.split('-')
							console.log(arr)
							this.firstName = arr[0].toLowerCase()
							this.lastName = arr[1]
						}
					}
				}
			})
			// console.log(vm)
		</script>
	</body>
</html>